package com.lovo.pis.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.lovo.pis.dto.UserBean;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CheckCodeUtil {

    /**
     * 生成验证码
     * @return
     */
    public static BufferedImage getCheckCodeImage(List<Integer> ints){
        //在缓冲区创建一张图片
        //BufferedImage（int,int,imageType) 参数依次为图片宽、高、图片类型
        BufferedImage checkCode = new BufferedImage(150, 50, BufferedImage.TYPE_INT_RGB);
        //得到图片的画笔
        Graphics2D graphics2D = (Graphics2D) checkCode.getGraphics();
        //设置随机在175-225的rgb颜色参数
        Color color1 = new Color((int)(Math.random() * 51 + 175),(int)(Math.random() * 51 + 175),(int)(Math.random() * 51 + 175));
        graphics2D.setColor(color1);
        //填充缓冲区（checkCode）这张图片的内容（背景）
        graphics2D.fillRect(0,0, 150, 50);
        //绘制验证码内容
        //循环生成4个随机字符
        int a =0;
        for (Integer anInt : ints) {
            char cha = (char)(int)anInt;
            Color color2 = new Color((int) (Math.random() * 71 + 50), (int) (Math.random() * 71 + 50), 					(int) (Math.random() * 71 + 50));
            //设置画笔颜色
            graphics2D.setColor(color2);
            //字体类型数组
            String[] ft = { "Arial", "Verdana", "Comic Sans MS", "Impact", "Haettenschweiler", "Lucida 					Sans Unicode", "Garamond","Courier New", "Book Antiqua", "Arial Narrow" };
            //数组长度的随机数
            int ftIndex  = (int)(Math.random()*ft.length);
            //字体对象设置随机字体类型以及随机字体大小
            Font font = new Font(ft[ftIndex],Font.BOLD,(int)(Math.random() * 30 +30));
            graphics2D.setFont(font);
            //绘制文字
            graphics2D.drawString(String.valueOf(cha),a*35+10,45);
            //绘制中划线，四个参数分别为起点和终点坐标
            a++;
            graphics2D.drawLine(0,a*1+28,150,a*1+28);
        }
        return checkCode;
    }

        //二维码
        public static BufferedImage getQRcode(UserBean userBean) throws WriterException, IOException {
            //需要使用到zxing 中的 core 的jar包
            //创建一个"画者"
            MultiFormatWriter mfw = new MultiFormatWriter();
            //画一个虚拟的二维码对象
            //需要：内容、类型、宽度、高度、其他信息Map集合（）
            //内容
            String content = userBean.toString();
            //二维码格式、类型
            BarcodeFormat type = BarcodeFormat.QR_CODE;
            //宽高
            int width = 500;
            int height = 500;
            //其他信息
            Map map = new HashMap(){{
                //设置字符编码集
                put(EncodeHintType.CHARACTER_SET,"UTF-8");
                //设置 纠错等级（二维码丢失多少就不能识别了） L:7%  H：30% M：15% Q：25%
                put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
                //设置外边界边距
                put(EncodeHintType.MARGIN,1);
            }};
            //画虚拟的二维码对象
            BitMatrix bitMatrix = mfw.encode(content,type,width,height,map);
            //流虚拟二维码对象信息写入文件
            //
            int black = Color.BLACK.getRGB();
            int white = Color.WHITE.getRGB();
            //画二维码需要画在图片对象上
            BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    //设置某个具体像素点的颜色，
                    //bitMatrix.get(x,y)?black:white 判断虚拟二维码对象当前位置是否有颜色
                    image.setRGB(x,y,bitMatrix.get(x,y)?black:white);
                }
            }
            //图片IO流输出到本地
            //第一个参数：需要输出的文件对象
            //第二个参数：文件格式
            //第三个参数：输出的目标文件
//            ImageIO.write(image,"jpg",new File("D:/test/2.jpg"));
            return image;
        }

}
